package negocio;

import dal.ArticuloDAL;

import excepciones.AvwException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import util.Utiles;

/**
 * Clase de articulo
 */
public class ArticuloWeb {
   // static final Logger logger = Utiles.iniciarLogger("ArticuloWeb", true);
    private Float artCostoEnvio;
    private Float artCostoEnvioBruto;
    private String artCodigo;
    private String artNombre;
    private String artDescripcion;
    private String artRubro;
    private String arwPalabrasClaves;
    private Marca artMarcaCodigo;
    private CategoriaWeb arwCategoria;
    private ArrayList arwFotos;
    private ArrayList arwDocmentos;
    private ArrayList artCategoriaArticulo;

    /**
     * Constructor
     */
    public ArticuloWeb() {
        artMarcaCodigo = null;
        arwCategoria = null;
        arwFotos = null;
        arwDocmentos = null;
        artCategoriaArticulo = null;
    }

    /**
     * Constructor
     */
    public ArticuloWeb(String artCodigo) {
        this.artCodigo = artCodigo;

        artMarcaCodigo = null;
        arwCategoria = null;
        arwFotos = null;
        arwDocmentos = null;
        artCategoriaArticulo = null;
    }

    /**
     * Constructor
     */
    public ArticuloWeb(String artCodigo, String artNombre, 
                       String artCostoEnvio, String artDescrComercial, 
                       String marCodigo, String rubCodigo) {
        /** XXX */
        /** Falta la parte de la marca */
        /** XXX */
        this.setArtCodigo(artCodigo);
        this.setArtNombre(artNombre);
        this.setArtDescripcion(artDescrComercial);
        this.setArtRubro(rubCodigo);
    }

    /**
     * Obtiene los siguientes datos del articulo: 
     * artCodigo, artNombre, artRubro, marNombre, artDescripcion, cawNombre, 
     * fawCodigo y fawDescripcion de sus fotos,
     * valor de las especificaciones tecnicas ('cruCodigo' y 'cruNombre') y
     * dawCodigo y dawDescripcion de los documentos asociados. ademas de las
     * caracteristicas, 'caracteristicas'
     * @return HashMap

     */
    public HashMap obtenerDatosCompletos() throws AvwException {
        HashMap articuloHash = new HashMap();
        ArrayList<HashMap> categorias = new ArrayList<HashMap>();
        ArrayList<HashMap> documentos = new ArrayList<HashMap>();
        ArrayList<HashMap> fotos = new ArrayList<HashMap>();
        
        articuloHash.put("artCodigo", this.getArtCodigo());
        articuloHash.put("artNombre", this.getArtNombre());
        articuloHash.put("artRubro", this.getArtRubro());
        articuloHash.put("marCodigo", this.getArtMarcaCodigo().getMarCodigo());
        articuloHash.put("marNombre", this.getArtMarcaCodigo().getMarNombre());
        articuloHash.put("artDescripcion", this.getArtDescripcion());
        articuloHash.put("cawNombre", this.getArwCategoria().getCawNombre());
        articuloHash.put("cawCodigo", this.getArwCategoria().getCawCodigo());

        /*Busca las fotos*/
        for (FotoArticuloWeb foto: this.getArwFotos()) {
            HashMap fotoHash = new HashMap();
            fotoHash.put("fawCodigo", foto.getFawCodigo());
            fotoHash.put("fawDescripcion", foto.getFawDescripcion());
            fotos.add(fotoHash);
        }

         //CArgo 
         for(CategoriaArticulo ca : this.getArtCategoriaArticulo()){
             HashMap artHash = new HashMap();
             artHash.put("cruNombre", ca.getCarCategoriaRubro().getCruNombre());
             artHash.put("carValor", ca.getCarValor());
             artHash.put("cruCodigo", ca.getCarCategoriaRubro().getCruCodigo());
             categorias.add(artHash);
         }

        for (DocumentoArticuloWeb documento: this.getArwDocumentos()) {
            HashMap documentoHash = new HashMap();
            documentoHash.put("dawCodigo", documento.getDawCodigo());
            documentoHash.put("dawDescripcion", documento.getDawDescripcion());
            documentos.add(documentoHash);
        }

        articuloHash.put("documentos", documentos);
        articuloHash.put("fotos", fotos);
        articuloHash.put("categoriaArticulo", categorias);
        return articuloHash;
    }

    /**
     * Obtiene los siguientes datos del articulo: 
     * artCodigo, artNombre, artRubro, marNombre, artDescripcion, cawNombre, 
     * fawCodigo y fawDescripcion de sus fotos y 
     * valor de las especificaciones tecnicas ('cruCodigo' y 'cruNombre').
     * @return HashMap
     */
    public HashMap obtenerDatos() throws AvwException {
        HashMap articuloHash = new HashMap();
        ArrayList<HashMap> fotos = new ArrayList<HashMap>();
        ArrayList<HashMap> categorias = new ArrayList<HashMap>();

        articuloHash.put("artCodigo", this.getArtCodigo());
        articuloHash.put("artNombre", this.getArtNombre());
        articuloHash.put("artRubro", this.getArtRubro());
        articuloHash.put("marCodigo", this.getArtMarcaCodigo().getMarCodigo());
        articuloHash.put("marNombre", this.getArtMarcaCodigo().getMarNombre());
        articuloHash.put("artDescripcion", this.getArtDescripcion());
        
        //Cargo 
        for(CategoriaArticulo ca : this.getArtCategoriaArticulo()){
            HashMap artHash = new HashMap();
            artHash.put("cruNombre", ca.getCarCategoriaRubro().getCruNombre());
            artHash.put("carValor", ca.getCarValor());
            artHash.put("cruCodigo", ca.getCarCategoriaRubro().getCruCodigo());
            categorias.add(artHash);
        }
        
        for (FotoArticuloWeb foto: this.getArwFotos()) {
            HashMap fotoHash = new HashMap();
            fotoHash.put("fawCodigo", foto.getFawCodigo());
            fotoHash.put("fawDescripcion", foto.getFawDescripcion());
            fotos.add(fotoHash);
        }

        articuloHash.put("fotos", fotos);
        articuloHash.put("categoriaArticulo", categorias);


        return articuloHash;
    }

    /**
     * Obtiene los siguientes datos del articulo articulo: 
     * artCodigo, artNombre, artRubro, marNombre, artDescripcion, 
     * cawNombre y fotos.
     * @return HashMap
     * */
    public HashMap obtenerDatosResumen() throws AvwException {
        HashMap articuloHash = new HashMap();
        articuloHash.put("artCodigo", this.getArtCodigo());
        articuloHash.put("artNombre", this.getArtNombre());
        articuloHash.put("artRubro", this.getArtRubro());
        articuloHash.put("marCodigo", this.getArtMarcaCodigo().getMarCodigo());
        articuloHash.put("marNombre", this.getArtMarcaCodigo().getMarNombre());
        articuloHash.put("artDescripcion", this.getArtDescripcion());


        articuloHash.put("cawNombre", this.getArwCategoria().getCawNombre());
        ArrayList<HashMap> fotos = new ArrayList<HashMap>();
        for (FotoArticuloWeb foto: this.getArwFotos()) {
            HashMap fotoHash = new HashMap();
            fotoHash.put("fawCodigo", foto.getFawCodigo());
            fotoHash.put("fawDescripcion", foto.getFawDescripcion());
            fotos.add(fotoHash);
        }
        articuloHash.put("fotos", fotos);

        return articuloHash;
    }

    /* Metodos sets y gets */

    public Float getArtCostoEnvio() {
        return artCostoEnvio;
    }

    public void setArtCostoEnvio(Float artCostoEnvio) {
        this.artCostoEnvio = artCostoEnvio;
    }

    public String getArtCodigo() {
        return artCodigo;
    }

    /**
     * @param artCodigo
     */
    public void setArtCodigo(String artCodigo) {
        this.artCodigo = artCodigo;
    }

    public String getArtNombre() {
        return artNombre;
    }

    public void setArtNombre(String artNombre) {
        this.artNombre = artNombre;
    }

    public String getArtDescripcion() {
        return artDescripcion;
    }

    public void setArtDescripcion(String artDescripcion) {
        this.artDescripcion = artDescripcion;
    }

    public String getArtRubro() {
        return artRubro;
    }

    public void setArtRubro(String artRubro) {
        this.artRubro = artRubro;
    }

    public String getArwPalabrasClaves() {
        return arwPalabrasClaves;
    }

    public void setArwPalabrasClaves(String arwPalabrasClaves) {
        this.arwPalabrasClaves = arwPalabrasClaves;
    }

    public Marca getArtMarcaCodigo() throws AvwException {
        if (artMarcaCodigo == null) {
            return ArticuloDAL.obtenerMarcaDeArticulo(this);
        }
        return artMarcaCodigo;
    }

    public void setArtMarcaCodigo(Marca artMarcaCodigo) {
        this.artMarcaCodigo = artMarcaCodigo;
    }

    public CategoriaWeb getArwCategoria() throws AvwException {
        // Verificamos si el articulo posee cargada la categoria
        if (arwCategoria == null) {
            // Cargamos la categoria del articulo
            this.setArwCategoria(ArticuloDAL.obtenerCategoriaWebDeArticulo(this));
        }
        return arwCategoria;
    }

    public void setArwCategoria(CategoriaWeb arwCategoria) {
        this.arwCategoria = arwCategoria;
    }

    public ArrayList<FotoArticuloWeb> getArwFotos() throws AvwException {
        if (arwFotos == null) {
            arwFotos = ArticuloDAL.obtenerFotosDeArticulo(this);
        }
        return arwFotos;
    }

    public void setArwFotos(ArrayList arwFotos) {
        this.arwFotos = arwFotos;
    }

    public ArrayList<DocumentoArticuloWeb> getArwDocumentos() throws AvwException {
        // Verificamos si el articulo posee cargado los documentos
        if (arwDocmentos == null) {
            arwDocmentos = ArticuloDAL.obtenerDocumentosDeArticulo(this);
        }
        return arwDocmentos;
    }

    public void setArwDocmentos(ArrayList arwDocmentos) {
        this.arwDocmentos = arwDocmentos;
    }

    public ArrayList<CategoriaArticulo> getArtCategoriaArticulo() throws AvwException {
        if (artCategoriaArticulo == null) {
            artCategoriaArticulo = ArticuloDAL.obtenerCategoriasArticulo(this);
        }
        return artCategoriaArticulo;
    }

    public void setArtCategoriaArticulo(ArrayList artCategoriaArticulo) {
        this.artCategoriaArticulo = artCategoriaArticulo;
    }

    public Float getArtCostoEnvioBruto() {
        return artCostoEnvioBruto;
    }

    public void setArtCostoEnvioBruto(Float artCostoEnvioBruto) {
        this.artCostoEnvioBruto = artCostoEnvioBruto;
    }
}
